package com.woniu.order.config;

import org.springframework.amqp.core.Binding;
import org.springframework.amqp.core.BindingBuilder;
import org.springframework.amqp.core.DirectExchange;
import org.springframework.amqp.core.Queue;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.HashMap;
import java.util.Map;


/**
 * RabbitMQ的配置类
 * 配置队列
 * 配置交换机（简单模式使用的是默认交换机）
 * 配置交换机与队列的绑定关系
 */
@Configuration
public class RabbitConfig {
    //创建交换机
    @Bean
    public DirectExchange delayExchange(){
        //创建交换机用于将死信通过交换机转发到其他队列中
        return new DirectExchange("delay-ex");
    }

    /*创建检查订单的队列（有消费者的）*/
    @Bean
    public Queue checkOrderQueue(){
//        return new Queue("deadMessageQueue",true);
        return new Queue("check_gym_order_queue",true);
    }


    @Bean
    public Binding bindingCheckOrderQueue(){
        //注意此处的交换器和路由键 必须上面参数中定义的交换机和路由键向对应
        return BindingBuilder.bind(checkOrderQueue()).to(delayExchange()).with("check_order");
    }


    //创建死信队列(被投递消息的队列)
    @Bean
    public Queue checkOrderQueueDelay() {
        Map<String, Object> params = new HashMap<>();
        //定义该队列中消息的生存时间 单位毫秒 生存时间最终对应业务的延迟执行时间
        params.put("x-message-ttl", 15*60 * 1000);
        // x-dead-letter-exchange 属性用于声明死信转发到的交换机
        params.put("x-dead-letter-exchange", "delay-ex");
        // x-dead-letter-routing-key 声明了这些死信在转发时携带的路由键名称。
        params.put("x-dead-letter-routing-key", "check_order");//路由键
//        return new Queue("order-delay", true, false, false, params);
        return new Queue("check_gym_order_queue_delay", true, false, false, params);
    }


}
